package com.qf.controller;

import com.qf.pojo.Goods;
import com.qf.service.GoodsService;
import com.qf.service.GoodsServiceImpl;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.List;

/**
 * 商品管理
 * @author fy
 * @version V1.0
 * @Project day41
 * @Package com.qf.controller
 * @Description:
 * @Date 2022/5/24 11:04
 */
@WebServlet("/goods")
public class GoodsController extends BaseServlet{

    /**
     * 跳转到首页
     * @param request
     * @param response
     * @return
     */
    public String index(HttpServletRequest request,HttpServletResponse response){
        //1:调用service查询所有商品分类数据
        GoodsService goodsService = new GoodsServiceImpl();
        List<Goods> list = goodsService.findGoodsAll();
        //2:将商品数据存入request域对象中
        request.setAttribute("goodsList", list);

        return "forward:/index.jsp";
    }

    /**
     * 跳转到商品详情页面
     * @param request
     * @param response
     * @return
     */
    public String detail(HttpServletRequest request,HttpServletResponse response){
        //1：接受传入的参数，商品id
        String id = request.getParameter("id");

        //2:根据商品id查询商品详细信息
        GoodsService goodsService = new GoodsServiceImpl();
        Goods goods = goodsService.findGoodsById(Integer.parseInt(id));
        //3:将查询到的商品数据放入request请求域对象中，带到页面中展示
        request.setAttribute("goods", goods);//"goods"是goodsDetail页面中的${goods}

        //4:请求转发到商品详情页面
        return "forward:/goodsDetail.jsp";
    }

    /**
     * 商品添加并带商品图片上传功能
     * @param request
     * @param response
     * @return
     */


    /**
     * 商品添加冰袋商品图片上传功能
     * @param request
     * @param response
     * @return
     */
    public String addGoods(HttpServletRequest request, HttpServletResponse response) throws Exception{
        //1:创建文件解析工厂对象
        DiskFileItemFactory factory = new DiskFileItemFactory();

        //2：从工厂中获取解析器对象
        ServletFileUpload parser = new ServletFileUpload(factory);

        //3：解决文件名的乱码问题
        parser.setHeaderEncoding("utf-8");
        //4：判断上传的表单类型，如果表单中带enctype="multipart/form-data" 说明是有上传文件
        //如果没有上传的商品图片文件，添加失败，跳转到管理员主页
        if (!ServletFileUpload.isMultipartContent(request)){
            return "redirect:/admin/admin.jsp";
        }

        //5:调用解析器上传数据
        List<FileItem> fileItems = parser.parseRequest(request);

        //6：获取保存文件的本地服务器目录路径
        //上传到项目编译后的路径位置，例如：D:\QQ\Bin\Down\1.学生目录\workspace\day41\out\artifacts\myshop_war_exploded\files
        String uploadPath = request.getServletContext().getRealPath("/files");
        System.out.println("===========图片上传后的位置==========="+uploadPath);
        //7：判断服务器保存文件目录是否存在，如果目录不存在自动创建文件夹
        File fileDir = new File(uploadPath);
        if(!fileDir.exists()){
            fileDir.mkdirs();
        }
        //8：创建Goods商品对象
        Goods goods = new Goods();
        //9：遍历表单中的每一个元素
        for (FileItem fileItem : fileItems) {
            if (fileItem.isFormField()){
                //10：判断如果是普通表单，将表单数据存入Goods商品对象中
                if (fileItem.getString()==null||"".equals(fileItem.getString())){
                    continue;
                }
                //如果是商品分类，放入goods对象中
                if ("typeid".equals(fileItem.getFieldName() )){
                    goods.setTid(Integer.parseInt(fileItem.getString()));
                }
                //商品名称
                if ("name".equals(fileItem.getFieldName() )){
                    goods.setName(new String(fileItem.getString().getBytes("ISO-8859-1"),"utf-8"));
                }
                //商品创建时间
                if ("pubdate".equals(fileItem.getFieldName() )){
                    String dateStr = fileItem.getString();
                    //日期格式化
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

                    goods.setPubdate(sdf.parse(dateStr));
                }
                //商品价格
                if ("price".equals(fileItem.getFieldName() )){
                    goods.setPrice(Integer.parseInt(fileItem.getString()));
                }
                //商品评分
                if ("star".equals(fileItem.getFieldName() )){
                    goods.setStar(Integer.parseInt(fileItem.getString()));
                }
                if ("intro".equals(fileItem.getFieldName() )){
                    goods.setIntro(new String(fileItem.getString().getBytes("ISO-8859-1"),"utf-8"));
                }

            } else {
                //11:判断如果是文件，则获取上传文件的路径和文件名
                //例如C：//xxx//xxx//xx.jpg
                String filePath = fileItem.getName();
                //12：如果未上传文件，继续处理下一个字段
                if ("".equals(filePath)||filePath==null){
                    continue;
                }

                //13：获取上传文件的文件名
                String fileName = filePath.substring(filePath.lastIndexOf("\\") + 1);
                //14：做io操作，保存文件到服务器硬盘的指定位置
                InputStream inputStream = fileItem.getInputStream();
                //15：将文件保存到服务器硬盘目录+文件名，组成具体的保存路径
                FileOutputStream out = new FileOutputStream(uploadPath + "\\" +fileName);
                System.out.println("=======文件保存后的完整路径======="+uploadPath + "\\" +fileName);

                //创建缓冲区
                byte[] buffer = new byte[1024];
                //读取的长度
                int len = 0;
                //如果读取的长度大于0，说明读取出来内容了，可以输出
                while ((len = inputStream.read(buffer))>0){
                    out.write(buffer,0,len);

                }
                out.close();
                inputStream.close();

                //16：保存后设置Goods商品对象中图片保存后的路径以及文件名信息
                goods.setPicture("http://localhost:8080/files/"+fileName);

            }
        }
        //17：调用service，保存goods商品对象到数据库
        GoodsService goodsService=new GoodsServiceImpl();
        goodsService.addGoods(goods);
        //跳转到商品查看页面
        return "redirect:/admin/showGoods.jsp";
    }

    /**
     * 查询商品列表展示
     * @return
     */
    public String show(HttpServletRequest request,HttpServletResponse response){
        //1:调用service查询所有商品数据
        GoodsService goodsService = new GoodsServiceImpl();
        List<Goods> list = goodsService.findGoodsAll();

        //2：将商品数据存入request域对象中
        request.setAttribute("goodsList", list);
        //3:利用请求转发商品查询页面，并将request语中的数据带回到页面中展示
        return "forward:/admin/showGoods.jsp";
    }
}



